#include <iostream>
#include <pthread.h>
#include <mutex>
#include <string>
using namespace std;
class Mutex
{
public:
    Mutex(pthread_mutex_t &mutex) : _mutex(mutex)
    {
    }
    ~Mutex() {}
    pthread_mutex_t _mutex;
    // string _name;
};
int num = 1000;
// 这是有关线程互斥接口测试的代码
// 模拟抢票
// 测试结果：票都是由其中某一个线程全部抢完的，有时候还会出现票为负数的情况
// 原因：因为在代码中num>0判断与num--都不是原子的，很有可能其中一个线程在执行时就被调度了
void *ticket(void *args)
{
    Mutex *mutex = static_cast<Mutex *>(args);
    while (true)
    {
        // 上锁
        pthread_mutex_lock(&mutex->_mutex);
        if (num > 0)
        {
            num--;
            cout << "线程抢到一张票，剩余票数:" << num << endl;
            pthread_mutex_unlock(&mutex->_mutex);
        }
        else
        {
            pthread_mutex_unlock(&mutex->_mutex);
            break;
        }
    }
    return nullptr;
}
int main()
{
    pthread_t t1, t2, t3, t4;

    // 锁
    pthread_mutex_t mutex;
    // 初始化锁
    pthread_mutex_init(&mutex, nullptr);
    Mutex m(mutex);
    if (pthread_create(&t1, nullptr, ticket, &m) != 0)
    {
        cout << "创建失败" << endl;
        return 1;
    }
    if (pthread_create(&t2, nullptr, ticket, &m) != 0)
    {
        cout << "创建失败" << endl;
        return 1;
    }
    if (pthread_create(&t3, nullptr, ticket, &m) != 0)
    {
        cout << "创建失败" << endl;
        return 1;
    }
    if (pthread_create(&t4, nullptr, ticket, &m) != 0)
    {
        cout << "创建失败" << endl;
        return 1;
    }

    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);
    pthread_join(t4, nullptr);
    //回收锁，切记要在线程结束后回收
    pthread_mutex_destroy(&m._mutex);
    return 0;
}